<?php
// +----------------------------------------------------------------------
// | QSCMS
// +----------------------------------------------------------------------
// | Copyright (c)  2025 https://www.qqss.net All rights reserved.
// +----------------------------------------------------------------------
// | Licensed QSCMS is not free software, commercial use must purchase official license from official website to avoid unnecessary legal disputes.
// +----------------------------------------------------------------------
// | Author: Contract 990504246@qq.com
// +----------------------------------------------------------------------

namespace app\common\bootstrap;

use Webman\Bootstrap;
use Webman\Config;
use Webman\Route;
use Webman\Middleware;

/**
 * 增强版插件系统启动类
 * 融合事件系统和webman风格的自动化功能
 */
class PluginSystem implements Bootstrap
{
    /**
     * 启动插件系统
     * @param $worker
     */
    public static function start($worker)
    {
        // 只在web worker中加载插件
        if ($worker && property_exists($worker, 'name') && $worker->name !== 'webman') {
            return;
        }

        // 加载公共函数
        $functions_file = base_path() . '/app/common/functions.php';
        if (file_exists($functions_file)) {
            require_once $functions_file;
        }

        // 1. 加载插件配置
        static::loadPluginConfigs();

        // 2. 加载插件中间件 
        static::loadPluginMiddlewares();

        // 3. 加载插件Bootstrap 
        static::loadPluginBootstraps($worker);

        // 4. 加载插件路由 
        static::loadPluginRoutes();

        // 5. 加载插件事件监听器
        static::loadPluginEvents();

        // 6. 预加载钩子系统（零I/O开销）
        static::preloadHookSystem();

        // 7. 注册静态文件处理 
        // static::loadPluginStaticFiles();

    }

    /**
     * 加载插件配置
     */
    protected static function loadPluginConfigs()
    {
        $pluginDir = base_path() . '/plugins';
        if (!is_dir($pluginDir)) {
            return;
        }

        // support\App::loadAllConfig方法
        foreach (\Webman\Util::scanDir($pluginDir, false) as $pluginName) {
            $configPath = "$pluginDir/$pluginName/config";
            if (is_dir($configPath)) {
                // 检查插件是否启用
                if (function_exists('is_plugin_enabled') && !is_plugin_enabled($pluginName)) {
                    continue;
                }

                // 这会自动处理plugin.{pluginName}命名空间
                Config::load($configPath, [], "plugin.$pluginName");
            }
        }
    }

    /**
     * 加载插件中间件
     */
    protected static function loadPluginMiddlewares()
    {
        // bootstrap.php中的中间件加载
        foreach (Config::get('plugin', []) as $pluginName => $pluginConfig) {
            if (!is_array($pluginConfig)) {
                continue;
            }

            // 检查插件是否启用
            if (function_exists('is_plugin_enabled') && !is_plugin_enabled($pluginName)) {
                continue;
            }

            // 加载插件中间件
            $middlewareConfig = $pluginConfig['middleware'] ?? [];
            if (!empty($middlewareConfig)) {
                Middleware::load($middlewareConfig, $pluginName);
            }

            // 加载静态文件中间件
            $staticConfig = $pluginConfig['static'] ?? [];
            if (!empty($staticConfig['middleware'])) {
                Middleware::load(['__static__' => $staticConfig['middleware']], $pluginName);
            }
        }
    }

    /**
     * 加载插件路由（增强现有功能）
     */
    protected static function loadPluginRoutes()
    {
        // 1. 加载基于config/route.php的路由
        static::loadConfigBasedRoutes();

        // 2. 加载基于控制器约定的路由（保持现有）
        // 注意：路由注册需要在webman路由系统初始化后进行，这里需要跳过
        // if (class_exists('\app\common\plugin\PluginRouteManager')) {
        //     \app\common\plugin\PluginRouteManager::registerPluginRoutes();
        // }
    }

    /**
     * 加载基于配置文件的路由
     */
    protected static function loadConfigBasedRoutes()
    {
        // 只加载启用插件的路由配置
        $pluginDir = base_path() . '/plugins';
        if (!is_dir($pluginDir)) {
            return;
        }

        foreach (\Webman\Util::scanDir($pluginDir, false) as $pluginName) {
            // 检查插件是否启用
            if (function_exists('is_plugin_enabled') && !is_plugin_enabled($pluginName)) {
                continue;
            }

            $configPath = "$pluginDir/$pluginName/config";
            if (is_dir($configPath)) {
                // 只加载route.php文件，避免重复加载其他配置
                $routeFile = "$configPath/route.php";
                if (is_file($routeFile)) {
                    require_once $routeFile;
                }
            }
        }
    }

    /**
     * 加载插件Bootstrap
     */
    protected static function loadPluginBootstraps($worker)
    {
        foreach (Config::get('plugin', []) as $pluginName => $pluginConfig) {
            if (!is_array($pluginConfig)) {
                continue;
            }

            // 检查插件是否启用
            if (function_exists('is_plugin_enabled') && !is_plugin_enabled($pluginName)) {
                continue;
            }

            $bootstrapClasses = $pluginConfig['bootstrap'] ?? [];
            foreach ($bootstrapClasses as $className) {
                if (!class_exists($className)) {
                    continue;
                }

                if (method_exists($className, 'start')) {
                    $className::start($worker);
                }
            }
        }
    }

    /**
     * 加载插件事件监听器
     */
    protected static function loadPluginEvents()
    {
        // 1. 加载基于配置的事件
        foreach (Config::get('plugin', []) as $pluginName => $pluginConfig) {
            if (!is_array($pluginConfig)) {
                continue;
            }

            // 检查插件是否启用
            if (function_exists('is_plugin_enabled') && !is_plugin_enabled($pluginName)) {
                continue;
            }

            $eventsConfig = $pluginConfig['events'] ?? [];
            if (!empty($eventsConfig)) {
                static::registerPluginEvents($pluginName, $eventsConfig);
            }
        }

    }

    /**
     * 注册插件事件
     */
    protected static function registerPluginEvents($pluginName, $eventsConfig)
    {
        foreach ($eventsConfig as $eventName => $listeners) {
            if (!is_array($listeners)) {
                $listeners = [$listeners];
            }

            foreach ($listeners as $listener) {
                if (is_callable($listener) || (is_string($listener) && class_exists($listener))) {
                    \Webman\Event\Event::on($eventName, $listener);
                }
            }
        }
    }

    /**
     * 预加载钩子系统（零I/O开销）
     */
    protected static function preloadHookSystem()
    {
        // 初始化钩子注册表
        if (class_exists('\app\common\plugin\HookRegistry')) {
            \app\common\plugin\HookRegistry::initialize();
            \app\common\plugin\HookRegistry::getStats();
        }
    }

    /**
     * 加载插件静态文件处理
     */
    // protected static function loadPluginStaticFiles()
    // {
    //     // 注册静态文件中间件
    //     Middleware::load(['__static__' => [
    //         \app\common\middleware\PluginStaticFileMiddleware::class
    //     ]]);
    // }
}
